package cn.cyh.user.service.impl;

import cn.cyh.basic.exception.BusinessException;
import cn.cyh.basic.uitls.StrUtils;
import cn.cyh.user.contants.UserContants;
import cn.cyh.user.domain.User;
import cn.cyh.user.mapper.UserMapper;
import cn.cyh.user.service.IVerifyCodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 因为不是数据库的业务所有不用继承baseserviceimpl
 * 因为操作的不是关系型数据库，所以不用添加事务
 */
@Service
public class IVerifyCodeServiceImpl implements IVerifyCodeService {

    @Autowired
    private UserMapper userMapper;
    @Autowired
    private RedisTemplate redisTemplate;
    @Override
    public void smsCode(Map<String,String> param) {
        String phone = param.get("phone");
        String type = param.get("type");
        // 校验 手机号不能为空
        if (StringUtils.isEmpty(phone) || StringUtils.isEmpty(type)) {
            throw new BusinessException("手机号不能为空");
        }
        String bussinessKey = "";
        // 注册的逻辑
        if ("register".equals(phone)){
            bussinessKey = UserContants.BUSINESS_REGISTER_PREFIX+phone;
            // 校验手机号是否被注册
            User user =  userMapper.loadByPhone(phone);
            if (user!=null){
                throw new BusinessException("该号码已经被注册");
            }
        // 绑定的逻辑
        }else if ("binder".equals(type)){
            bussinessKey = UserContants.BUSINESS_BINDER_PREFIX+phone;
        }
        if (StringUtils.hasLength(bussinessKey)) {
            sendCode(bussinessKey);
        }


    }
    // 发送验证码抽取
    public void sendCode(String bussinessKey){
        // 判断验证码是否有效(3分钟)
        // 定义一个常量类
        Object codeTmp = redisTemplate.opsForValue().get(bussinessKey);
        String code = "";

        // 是否能从redis中拿到
        // 如果拿到
        if (codeTmp!=null){
            String timeTmp =  codeTmp.toString().split(":")[1];// 拿到时间戳
            // 判断是否超过了重发时间
            if (System.currentTimeMillis()-Long.valueOf(timeTmp)<=1*60*1000){// 没超过一分钟不可以重发
                throw new BusinessException("请不要重复发送验证码");
            }else {
                // 超过了就使用之前验证码
                code = codeTmp.toString().split(":")[0];
            }
        }else { // 如果拿不到就重新生成验证码
            code = StrUtils.getComplexRandomString(4);
        }
        // 存储redis
        redisTemplate.opsForValue().set(bussinessKey,
                code+":"+System.currentTimeMillis(),// 验证码加上时间戳
                3, TimeUnit.MINUTES);// 设置过期时间 3分钟
        System.out.println("验证码"+code);
    }
}
